package db

import (
	"fmt"

	"github.com/xujiajun/nutsdb"
	"github.com/xujiajun/nutsdb/inmemory"
	"lucidity.note/app/common/logger"
)

type MemoryConn struct {
	// 内存模式
	DB *inmemory.DB
}

// 插入数据or更新数据，持久化到数据文件中
// @param bucket {string} 数据桶，类似与关系型数据库中的表
// @param key {string} 键
// @param value {string} 数据值
func (conn *MemoryConn) Insert(bucket, key, value string) error {
	if err := conn.DB.Put(bucket, []byte(key), []byte(value), nutsdb.Persistent); nil != err {
		logger.FAULT.Fatalf(fmt.Sprintf("内存模式-插入数据失败{bucket=%s, key=%s, value=%s}: %s", bucket, key, value, err.Error()))
		return err
	}
	return nil
}

// 更新数据，持久化到数据文件中
// @param bucket {string} 数据桶，类似与关系型数据库中的表
// @param key {string} 键
// @param value {string} 数据值
func (conn *MemoryConn) Update(bucket, key, value string) error {
	if err := conn.DB.Put(bucket, []byte(key), []byte(value), nutsdb.Persistent); nil != err {
		logger.FAULT.Fatalf(fmt.Sprintf("内存模式-更新数据失败{bucket=%s, key=%s, value=%s}: %s", bucket, key, value, err.Error()))
		return err
	}
	return nil
}

// 查询数据
// @param bucket {string} 数据桶，类似与关系型数据库中的表
// @param key {string} 键
func (conn *MemoryConn) Select(bucket, key string) (value string, err error) {
	if entry, err := conn.DB.Get(bucket, []byte(key)); nil != err {
		logger.FAULT.Fatalf(fmt.Sprintf("内存模式-查询数据失败{bucket=%s, key=%s}: %s", bucket, key, err.Error()))
		return "", err
	} else {
		value = string(entry.Value)
	}
	return value, err
}

// 删除数据
// @param bucket {string} 数据桶，类似与关系型数据库中的表
// @param key {string} 键
func (conn *MemoryConn) Delete(bucket, key string) error {
	if err := conn.DB.Delete(bucket, []byte(key)); nil != err {
		logger.FAULT.Fatalf(fmt.Sprintf("内存模式-删除数据失败{bucket=%s, key=%s}: %s", bucket, key, err.Error()))
		return err
	}
	return nil
}
